﻿using System;
using System.Configuration;
using System.Data.Common;

namespace ProjetoSolo.QueroGas.Infraestrutura.PersistenciaAdo.Util
{
    public static class FabricaConexao
    {
        public static DbConnection CriarConexao(string nomeStringConexao)
        {
            if (String.IsNullOrEmpty(nomeStringConexao))
                throw new ArgumentException("O nome da conexão do banco deve ser informado.");

            ConnectionStringSettings stringConfiguracaoBanco = RecuperarStringConfiguracaoBanco(nomeStringConexao);
            DbProviderFactory fabricaProvedorBanco = CriarFabricaProvedorBanco(stringConfiguracaoBanco);

            DbConnection conexao = fabricaProvedorBanco.CreateConnection();

            if (conexao == null)
                throw new ConfigurationErrorsException("A conexão não pode ser criada. Verifique se o nome da string de conexao informado está correto.");

            conexao.ConnectionString = stringConfiguracaoBanco.ConnectionString;

            return conexao;
        }

        private static DbProviderFactory CriarFabricaProvedorBanco(ConnectionStringSettings stringConfiguracaoBanco)
        {
            string nomeProvedorBanco = stringConfiguracaoBanco.ProviderName;

            if(nomeProvedorBanco == null)
                throw new Exception("Não foi encontrado o nome do provider do banco na string de conexão.");

            DbProviderFactory fabricaProvadorBanco = DbProviderFactories.GetFactory(nomeProvedorBanco);

            return fabricaProvadorBanco;
        }

        private static ConnectionStringSettings RecuperarStringConfiguracaoBanco(string nomeStringConexao)
        {
            ConnectionStringSettings stringConfiguracaoConexao = null;

            try
            {
                stringConfiguracaoConexao = ConfigurationManager.ConnectionStrings[nomeStringConexao];

                if (stringConfiguracaoConexao == null)
                    throw new ConfigurationErrorsException(String.Format("O nome {0} informado na string de conexão não foi encontrado no web.config.", nomeStringConexao));
            }
            catch (Exception)
            {
                throw new Exception("Houve um erro na leitura do arquivo de configuração. Verifique se o arquivo de configuração existe dentro do projeto e se o mesmo está formatado de forma correta.");
            }            

            return stringConfiguracaoConexao;
        }
    }
}
